fetch-on-render 是指在 Component render 後,才開始觸發 API 資料請求。
使用範例:
useEffect(() => {
fetchData().then((response) => {
setData(response);
});
}, []);
優點
useEffect
或是 React Query 的 useQuery
。缺點
在進入頁面時預先抓取資料,再渲染完整的頁面。以下範例僅為方便說明,通常會使用套件或框架來實作。
使用範例:
function fetchProfileData() {
return Promise.all([fetchUser(), fetchPosts()]).then(([user, posts]) => {
return { user, posts };
});
}
優點
缺點
React 團隊推薦的用法,搭配 React 18 的 Suspense 使用。
使用範例:
<Suspense fallback={<Loading />}>
<SomeComponent />
</Suspense>
當你進入一個頁面時,會立即開始抓取資料。在取得資料時,會顯示 fallback UI (<Loading />
),完成後才會顯示裡面 <SomeComponent />
的內容。
優點
缺點
useEffect
或 event handler fetch data 並不會觸發 Suspense。use
來讀取 Promise。參考資料:
https://17.reactjs.org/docs/concurrent-mode-suspense.html#approach-2-fetch-then-render-not-using-suspense
https://chentsulin.medium.com/%E7%90%86%E8%A7%A3-react-%E7%9A%84%E4%B8%8B%E4%B8%80%E6%AD%A5-concurrent-mode-%E8%88%87-suspense-327b8a3df0fe
https://bobaekang.com/blog/component-colocation-composition/
https://www.youtube.com/watch?v=lcLbYictX3k
https://react.dev/reference/react/Suspense